<ol>
	<li>
	<h2>hello world���Ӽ��</h2>

	<p>��������ʾ����һ�����͵�TCP������Ӧ�ã�����λ��example/helloworldĿ¼�С�</p>

	<ul>
		<li>����˺Ϳͻ��˵���ϢЭ��Ƚϼ򵥣���ϢͷΪ4���ֽڣ����Ա�ʾ��Ϣ��ĳ��ȣ���Ϣ��Ϊһ���ַ�����byte[]</li>
		<li>�����������������6789�˿�</li>
		<li>�ͻ������ӵ�����˺󣬻����������������һ����Ϣ</li>
		<li>�������յ���Ϣ����Ӧһ����Ϣ</li>
		<li>֮�󣬿�ܲ���Զ��ӿͻ��˷���������������������Ҳ����������û�г�ʱ</li>
		<li>��ܲ���ڶ������Զ�������<strong>��t-io��˵��ֻ���һ�д����ӵ���Զ���������</strong>��</li>
	</ul>
	</li>
	<li>
	<h2>����ģ�����</h2>

	<pre>
<code class="language-xml">&lt;dependency&gt;
    &lt;groupId&gt;org.t-io&lt;/groupId&gt;
    &lt;artifactId&gt;tio-core&lt;/artifactId&gt;
    &lt;version&gt;2.0.0.v20170806-RELEASE&lt;/version&gt;
&lt;/dependency&gt;</code></pre>

	<p>ע����ʱ��������Ϳͻ��˵�ҵ����Ϣ���ṹ��һ������������£���Ϣ���Ķ���Ͳ�Ҫ���ڹ���ģ��</p>

	<pre>
<code class="language-java">public class HelloPacket extends Packet {
	public static final int HEADER_LENGHT = 4;//��Ϣͷ�ĳ���
	public static final String CHARSET = "utf-8";
	private byte[] body;

	/**
	 * @return the body
	 */
	public byte[] getBody() {
		return body;
	}

	/**
	 * @param body the body to set
	 */
	public void setBody(byte[] body) {
		this.body = body;
	}
}
           </code></pre>

	<p>ע����ʱ��������˺Ϳͻ��˵ı�������㷨��һ�������ʱ��Ͳ�Ҫ�Թ���ģ������ɱ���ͽ���Ĵ��룬���Ƿֱ���ڷ������˺Ϳͻ�����ɡ�</p>

	<pre>
<code class="language-java">/**
 * hello world���з������˺Ϳͻ��˵ı�������㷨��һ���ģ����Գ���һ�������ĸ������
 * @author tanyaowu 
 *
 */
public abstract class HelloAbsAioHandler implements AioHandler {
	/**
	 * ���룺��ҵ����Ϣ������Ϊ���Է��͵�ByteBuffer
	 * �ܵ���Ϣ�ṹ����Ϣͷ + ��Ϣ��
	 * ��Ϣͷ�ṹ��    4���ֽڣ��洢��Ϣ��ĳ���
	 * ��Ϣ��ṹ��   �����json����byte[]
	 */
	@Override
	public ByteBuffer encode(Packet packet, GroupContext groupContext, ChannelContext channelContextImpl) {
		HelloPacket helloPacket = (HelloPacket) packet;
		byte[] body = helloPacket.getBody();
		int bodyLen = 0;
		if (body != null) {
			bodyLen = body.length;
		}

		//bytebuffer���ܳ����� = ��Ϣͷ�ĳ��� + ��Ϣ��ĳ���
		int allLen = HelloPacket.HEADER_LENGHT + bodyLen;
		//����һ���µ�bytebuffer
		ByteBuffer buffer = ByteBuffer.allocate(allLen);
		//�����ֽ���
		buffer.order(groupContext.getByteOrder());

		//д����Ϣͷ----��Ϣͷ�����ݾ�����Ϣ��ĳ���
		buffer.putInt(bodyLen);

		//д����Ϣ��
		if (body != null) {
			buffer.put(body);
		}
		return buffer;
	}

	/**
	 * ���룺�ѽ��յ���ByteBuffer�������Ӧ�ÿ���ʶ���ҵ����Ϣ��
	 * �ܵ���Ϣ�ṹ����Ϣͷ + ��Ϣ��
	 * ��Ϣͷ�ṹ��    4���ֽڣ��洢��Ϣ��ĳ���
	 * ��Ϣ��ṹ��   �����json����byte[]
	 */
	@Override
	public HelloPacket decode(ByteBuffer buffer, ChannelContext channelContextImpl) throws AioDecodeException {
		int readableLength = buffer.limit() - buffer.position();
		//�յ��������鲻��ҵ������򷵻�null�Ը��߿�����ݲ���
		if (readableLength < HelloPacket.HEADER_LENGHT) {
			return null;
		}

		//��ȡ��Ϣ��ĳ���
		int bodyLength = buffer.getInt();

		//���ݲ���ȷ�����׳�AioDecodeException�쳣
		if (bodyLength < 0) {
			throw new AioDecodeException("bodyLength [" + bodyLength + "] is not right, remote:" + channelContextImpl.getClientNode());
		}

		//���㱾����Ҫ�����ݳ���
		int neededLength = HelloPacket.HEADER_LENGHT + bodyLength;
		//�յ��������Ƿ��㹻���
		int isDataEnough = readableLength - neededLength;
		// ������Ϣ�峤��(ʣ�µ�buffe�鲻����Ϣ��)
		if (isDataEnough < 0) {
			return null;
		} else //����ɹ�
		{
			HelloPacket imPacket = new HelloPacket();
			if (bodyLength > 0) {
				byte[] dst = new byte[bodyLength];
				buffer.get(dst);
				imPacket.setBody(dst);
			}
			return imPacket;
		}
	}
}</code></pre>

	<pre>
<code class="language-java">public interface Const
{
    public static final int PORT = 6789;
}</code></pre>

	<ul>
		<li>
		<h3>��������</h3>
		</li>
		<li>
		<h3>����ҵ����Ϣ���ṹ</h3>
		</li>
		<li>
		<h3>ʵ��ioͨѶ�бز����ٵı���ͽ���</h3>
		</li>
		<li>
		<h3>����һ��˫��Լ���Ķ˿�</h3>
		</li>
	</ul>
	</li>
	<li>
	<h2>����˴���</h2>

	<p>ע���˴��̳���HelloAbsAioHandler�������Ѿ���ɱ���ͽ���Ĺ���</p>

	<pre>
<code class="language-java">public class HelloServerAioHandler extends HelloAbsAioHandler implements ServerAioHandler {
	/** 
	 * ������Ϣ
	 */
	@Override
	public void handler(Packet packet, ChannelContext channelContextImpl) throws Exception {
		HelloPacket helloPacket = (HelloPacket) packet;
		byte[] body = helloPacket.getBody();
		if (body != null) {
			String str = new String(body, HelloPacket.CHARSET);
			System.out.println("�յ���Ϣ��" + str);

			HelloPacket resppacket = new HelloPacket();
			resppacket.setBody(("�յ��������Ϣ�������Ϣ��:" + str).getBytes(HelloPacket.CHARSET));
			Aio.send(channelContextImpl, resppacket);
		}
		return;
	}
}</code></pre>

	<pre>
<code class="language-java">public class HelloServerStarter {
	//handler, �������롢���롢��Ϣ����
	public static ServerAioHandler aioHandler = new HelloServerAioHandler();

	//�¼�������������Ϊnull���������Լ�ʵ�ָýӿڣ����Բο�showcase�˽�Щ�ӿ�
	public static ServerAioListener aioListener = null;

	//һ�����ӹ��õ������Ķ���
	public static ServerGroupContext serverGroupContext = new ServerGroupContext(aioHandler, aioListener);

	//aioServer����
	public static AioServer aioServer = new AioServer(serverGroupContext);

	//��ʱ����Ҫ��ip������Ҫ��null
	public static String serverIp = null;

	//�����Ķ˿�
	public static int serverPort = Const.PORT;

	/**
	 * �����������
	 */
	public static void main(String[] args) throws IOException {
		serverGroupContext.setHeartbeatTimeout(org.tio.examples.helloworld.common.Const.TIMEOUT);

		aioServer.start(serverIp, serverPort);
	}
}</code></pre>

	<ul>
		<li>
		<h3>ʵ��AioHandler</h3>
		</li>
		<li>
		<h3>��������</h3>
		</li>
	</ul>
	</li>
	<li>
	<h2>�ͻ��˴���</h2>

	<p>ע���˴��̳���HelloAbsAioHandler�������Ѿ���ɱ���ͽ���Ĺ���</p>

	<pre>
<code class="language-java">public class HelloClientAioHandler extends HelloAbsAioHandler implements ClientAioHandler {
	/** 
	 * ������Ϣ
	 */
	@Override
	public void handler(Packet packet, ChannelContext channelContextImpl) throws Exception {
		HelloPacket helloPacket = (HelloPacket) packet;
		byte[] body = helloPacket.getBody();
		if (body != null) {
			String str = new String(body, HelloPacket.CHARSET);
			System.out.println("�յ���Ϣ��" + str);
		}

		return;
	}

	private static HelloPacket heartbeatPacket = new HelloPacket();

	/** 
	 * �˷����������null����ܲ����򲻻ᷢ������������ط�null����ܲ���ᶨʱ�����������ص���Ϣ��
	 */
	@Override
	public HelloPacket heartbeatPacket() {
		return heartbeatPacket;
	}
}</code></pre>

	<pre>
<code class="language-java">public class HelloClientStarter {
	//�������ڵ�
	public static Node serverNode = new Node("127.0.0.1", Const.PORT);

	//handler, �������롢���롢��Ϣ����
	public static ClientAioHandler aioClientHandler = new HelloClientAioHandler();

	//�¼�������������Ϊnull���������Լ�ʵ�ָýӿڣ����Բο�showcase�˽�Щ�ӿ�
	public static ClientAioListener aioListener = null;

	//�������Զ����ӵģ������Զ���������Ϊnull
	private static ReconnConf reconnConf = new ReconnConf(5000L);

	//һ�����ӹ��õ������Ķ���
	public static ClientGroupContext clientGroupContext = new ClientGroupContext(aioClientHandler, aioListener, reconnConf);

	public static AioClient aioClient = null;
	public static ClientChannelContext clientChannelContext = null;

	/**
	 * �����������
	 */
	public static void main(String[] args) throws Exception {
		clientGroupContext.setHeartbeatTimeout(org.tio.examples.helloworld.common.Const.TIMEOUT);
		aioClient = new AioClient(clientGroupContext);
		clientChannelContext = aioClient.connect(serverNode);
		//���Ϻ󣬷�����Ϣ����
		send();
	}

	private static void send() throws Exception {
		HelloPacket packet = new HelloPacket();
		packet.setBody("hello world".getBytes(HelloPacket.CHARSET));
		Aio.send(clientChannelContext, packet);
	}
}</code></pre>

	<p>&nbsp;</p>

	<ul>
		<li>
		<h3>ʵ��AioHandler</h3>
		</li>
		<li>
		<h3>��������</h3>
		</li>
	</ul>
	</li>
	<li>
	<h2>��һ��</h2>
	ȥ<a href="https://git.oschina.net/tywo45/t-io" target="_blank">https://git.oschina.net/tywo45/t-io</a>����Դ���뼰���ӣ������showcase������ר��Ϊѧϰt-io��д�ģ������Ҳ��׼��������ģ�����ֱ������������Ŀ���ֽżܡ�������ɺ��밴���沽�赼�뵽eclipse��

	<p><a href="https://git.oschina.net/tywo45/t-io/raw/master/docs/blog/t-io%E7%B3%BB%E5%88%97%E6%96%87%E6%A1%A3%E4%B9%8Bhelloworld%EF%BC%881%EF%BC%89/import-1.png" target="_blank"><img src="https://git.oschina.net/tywo45/t-io/raw/master/docs/blog/t-io%E7%B3%BB%E5%88%97%E6%96%87%E6%A1%A3%E4%B9%8Bhelloworld%EF%BC%881%EF%BC%89/import-1.png" /></a></p>

	<p><a href="https://git.oschina.net/tywo45/t-io/raw/master/docs/blog/t-io%E7%B3%BB%E5%88%97%E6%96%87%E6%A1%A3%E4%B9%8Bhelloworld%EF%BC%881%EF%BC%89/import-2.png" target="_blank"><img src="https://git.oschina.net/tywo45/t-io/raw/master/docs/blog/t-io%E7%B3%BB%E5%88%97%E6%96%87%E6%A1%A3%E4%B9%8Bhelloworld%EF%BC%881%EF%BC%89/import-2.png" /></a></p>

	<p><a href="https://git.oschina.net/tywo45/t-io/raw/master/docs/blog/t-io%E7%B3%BB%E5%88%97%E6%96%87%E6%A1%A3%E4%B9%8Bhelloworld%EF%BC%881%EF%BC%89/import-3.png" target="_blank"><img src="https://git.oschina.net/tywo45/t-io/raw/master/docs/blog/t-io%E7%B3%BB%E5%88%97%E6%96%87%E6%A1%A3%E4%B9%8Bhelloworld%EF%BC%881%EF%BC%89/import-3.png" /></a></p>
	</li>
</ol>
